package DAO;
import java.sql.*;
import bean.Nacional;
import bean.Internacional;
import bean.Cliente;
import java.util.ArrayList;
import views.PanelCliente;

/**
 *
 * @author cHreS
 */
public class SQLServerDAOCliente implements DAOCliente {
   

    @Override
    public ArrayList<Cliente> queryAll() {
        
        ArrayList<Cliente> listaCliente = new ArrayList<Cliente>(); 
        ResultSet rs = null;
        ResultSet rs2=null;
        PreparedStatement pstmt2=null;
        try {
            //1. Se registra el driver de la BD
             Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
            // Driver myDriver = new com.microsoft.sqlserver.jdbc.SQLServerDriver();
            //2. Se abre la conexión
            String connectionUrl = "jdbc:sqlserver://inti.lab.inf.pucp.edu.pe:1433;"
                    + "databaseName=inf282;user=inf282;password=inf282db;timeout=30";
          Connection conn = DriverManager.getConnection(connectionUrl);
           // conn = ;
            //3. Se ejecuta la sentencia SQL
          PreparedStatement  pstmt = conn.prepareStatement("SELECT * FROM G04_CLIENTE");
            rs = pstmt.executeQuery();
            

// select 
//g04_cliente.IDCLIENTE, RUC,RAZON_SOCIAL,DIRECCION,REPRESENTANTE,LINEA_cREDITO,
//G04_NACIONAL.CIUDAD,g04_nacional.DEPARTAMENTO, g04_internacional.divisa,g04_internacional.PAIS FROM((G04_CLIENTE
//left JOIN G04_NACIONAL
//on G04_CLIENTE.IDCLIENTE=G04_NACIONAL.IDCLIENTE)
//left join G04_INTERNACIONAL
//on G04_CLIENTE.IDCLIENTE=G04_INTERNACIONAL.IDCLIENTE)

                       
            //4. Se evalúan los resultados
            while (rs.next()) {
                int id = rs.getInt("IDCLIENTE");
                String ruc = rs.getString("RUC");
                String razon_social = rs.getString("RAZON_SOCIAL");
                String direccion = rs.getString("DIRECCION");
                String representante = rs.getString("REPRESENTANTE");
                float linea_credito = rs.getFloat("LINEA_CREDITO");
                String tipo = rs.getString("TIPO");
                //Cliente c = null;
                if (tipo.equalsIgnoreCase("N")) {
                   pstmt2 = conn.prepareStatement("SELECT *FROM G04_NACIONAL "
                            + "where G04_NACIONAL.IDCLIENTE=" + id + "");
                    rs2 = pstmt2.executeQuery();
                    if (rs2.next()){
                        String departamento = rs2.getString("departamento");
                        String ciudad = rs2.getString("ciudad");
                        Cliente c = new Nacional(id, ruc, razon_social, direccion, representante, linea_credito, tipo, departamento, ciudad);
                        listaCliente.add(c);
                    }
                    rs2.close();
                } else {
                    pstmt2 = conn.prepareStatement("SELECT *FROM G04_INTERNACIONAL "
                            + "where G04_INTERNACIONAL.IDCLIENTE=" + id + "");
                    rs2 = pstmt2.executeQuery();
                    if (rs2.next()){
                        float divisa = rs2.getFloat("divisa");
                        String pais = rs2.getString("pais");
                        Cliente c = new Internacional(id, ruc, razon_social, direccion, representante, linea_credito, tipo, divisa, pais);
                        listaCliente.add(c);
                    }
                    rs2.close();
                }
                
                 
            }
        } catch (Exception ex) {
           // ex.printStackTrace();
        } finally {
            //5. Se cierra la conexión
            try {
                if (rs != null) {
                    rs.close();
                }
            } catch (Exception e) {
              //  e.printStackTrace();
            }
        }

        return listaCliente;
    }

    @Override
    public int agregarCliente(Cliente c) {
        int result =0;
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        try {
            //1. Se registra el driver de la BD
            Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
            //Driver myDriver = new com.microsoft.sqlserver.jdbc.SQLServerDriver();
            //2. Se abre la conexión
            String connectionUrl = "jdbc:sqlserver://inti.lab.inf.pucp.edu.pe:1433;"+   
                    "databaseName=inf282;user=inf282;password=inf282db;";
            conn = DriverManager.getConnection(connectionUrl);
            //3. Se ejecuta la sentencia SQL
            String SQLString = null;
            SQLString =
                    "INSERT INTO G04_CLIENTE(IDCLIENTE,RUC,"
                    + "RAZON_SOCIAL, DIRECCION, REPRESENTANTE, LINEA_CREDITO, "
                    + "TIPO) "
                    + "VALUES(?,?,?,?,?,?,?)";
                pstmt = conn.prepareStatement(SQLString);
                pstmt.setInt(1,c.getId());
                pstmt.setString(2,c.getRUC());
                pstmt.setString(3,c.getRazonSocial());
                pstmt.setString(4,c.getDireccion());
                pstmt.setString(5,c.getRepresentante());
                pstmt.setFloat(6,c.getLineaCred());
                pstmt.setString(7,c.getTipo());
                         
                result =  pstmt.executeUpdate();
                
                if (c instanceof Nacional){                        
                SQLString =
                    "INSERT INTO G04_NACIONAL(IDCLIENTE, DEPARTAMENTO,CIUDAD) "
                     + "VALUES(?,?,?)";
                pstmt = conn.prepareStatement(SQLString);
                pstmt.setInt(1,c.getId());
                pstmt.setString(2, ((Nacional)c).getDepartamento());
                pstmt.setString(3, ((Nacional)c).getCiudad());
               
               
            } else if (c instanceof Internacional){
                 SQLString =
                    "INSERT INTO G04_INTERNACIONAL(IDCLIENTE,DIVISA,PAIS) "
                     + "VALUES(?,?,?)";
                pstmt = conn.prepareStatement(SQLString);
                pstmt.setInt(1,c.getId());
                pstmt.setFloat(2, ((Internacional)c).getDivisa());
                pstmt.setString(3, ((Internacional)c).getPais());           
                             
            }
            //se inserta en las tablas isa
            result =  pstmt.executeUpdate();
            
            //4. Se evalúan los resultados
            if (result == 0){
                throw new Exception();
            }            
        } catch (Exception ex) {
            ex.printStackTrace();
        } finally {
             //5. Se cierra la conexión
             try {if (rs != null) rs.close(); } 
             catch(Exception e){e.printStackTrace();}  
        } 
        return result;
    }

    @Override
    public int update(Cliente c) {
       ResultSet rs = null;
        PreparedStatement pstmt2=null;  
        PreparedStatement pstmt3=null;  
        int result =0;
        Connection conn = null;
        PreparedStatement pstmt = null;
               
        try {
            //1. Se registra el driver de la BD
            Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
            //Driver myDriver = new com.microsoft.sqlserver.jdbc.SQLServerDriver();
            //2. Se abre la conexión
            String connectionUrl = "jdbc:sqlserver://inti.lab.inf.pucp.edu.pe:1433;"+   
                    "databaseName=inf282;user=inf282;password=inf282db;";
            conn = DriverManager.getConnection(connectionUrl);
            //3. Se ejecuta la sentencia SQL
            String SQLString1= null;
            String SQLString3=null;
            String SQLString2=null;
            String cadC,cadR,cadRS,cadD,cadRE,cadLC,cadT;
            cadC=Integer.toString(c.getId());
            cadR=c.getRUC();
            cadRS=c.getRazonSocial();
            cadD=c.getDireccion();
            cadRE=c.getRepresentante();
            cadLC=Float.toString(c.getLineaCred());
                               
               SQLString1 =
                    "UPDATE G04_CLIENTE SET IDCLIENTE="+cadC+",RUC='"+cadR+"',"
                    + "RAZON_SOCIAL='"+cadRS+"', DIRECCION='"+cadD+"', REPRESENTANTE='"+cadRE+"', LINEA_CREDITO="+cadLC+"WHERE IDCLIENTE="+cadC+"";
            
                    pstmt = conn.prepareStatement(SQLString1);
                      result =  pstmt.executeUpdate();            
                               
                if (c instanceof Nacional){  
                    String cadI,cadDe,cadCi;
                    cadI=Integer.toString(c.getId());
                    cadDe=((Nacional)c).getDepartamento();
                    cadCi=((Nacional)c).getCiudad();
                
                SQLString2="UPDATE G04_NACIONAL SET IDCLIENTE="+cadC+",DEPARTAMENTO='"+cadDe+"',CIUDAD='"+cadCi+"' WHERE IDCLIENTE="+cadI+"";
                     
                    pstmt = conn.prepareStatement(SQLString2);
                   result =  pstmt.executeUpdate();    
                                   
                }
                    else if (c instanceof Internacional){
                
                String cadId,cadDI,cadPa;
                cadId=Integer.toString(c.getId());
                cadDI=Float.toString(((Internacional)c).getDivisa());
                cadPa=((Internacional)c).getPais();
                 SQLString3=
                    "UPDATE G04_INTERNACIONAL SET IDCLIENTE="+cadC+",DIVISA="+cadDI+",PAIS='"+cadPa+"' WHERE IDCLIENTE='"+cadId+"'";
                pstmt = conn.prepareStatement(SQLString3);
                   result =  pstmt.executeUpdate();                    
               
            }
            
            if (result == 0){
                throw new Exception();
            }            
        } catch (Exception ex) {
            ex.printStackTrace();
        } finally {
             //5. Se cierra la conexión
             try {if (rs != null) rs.close(); } 
             catch(Exception e){e.printStackTrace();}  
        } 
        return result;
    }

    @Override
    public int delete(int idClient) {
        
         int result=0;
        Connection conn = null;
        PreparedStatement pstmt = null;
        PreparedStatement pstmt2=null;
        PreparedStatement pstmt3=null;
        ResultSet rs = null;
        
        try {
            //1. Se registra el driver de la BD
            Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
            //2. Se abre la conexión
            String connectionUrl = "jdbc:sqlserver://inti.lab.inf.pucp.edu.pe:1433;"+
                    "databaseName=inf282;user=inf282;password=inf282db;";
            conn = DriverManager.getConnection(connectionUrl);
            //3. Se ejecuta la sentencia SQL
            String SQLString = null;
            String SQLString2=null;
            String SQLString3=null;
            //Se prepara la sentencia SQL
            SQLString ="DELETE FROM G04_NACIONAL"+" WHERE IDCLIENTE = "+idClient+";";
            SQLString2="DELETE FROM G04_INTERNACIONAL"+" WHERE IDCLIENTE = "+idClient+";";
            SQLString3="DELETE FROM G04_CLIENTE"+" WHERE IDCLIENTE = "+idClient+";";
            
            pstmt = conn.prepareStatement(SQLString);
            result =  pstmt.executeUpdate();
            
            pstmt2=conn.prepareStatement(SQLString2);
            result =  pstmt2.executeUpdate();
            
            pstmt3=conn.prepareStatement(SQLString3);
            result =  pstmt3.executeUpdate();
            
            
            //4. Se evalúan los resultados
            if (result == 0){
                throw new Exception();
            }            
        } catch (Exception ex) {
            ex.printStackTrace();
        } finally {
             //5. Se cierra la conexión
             try {if (rs != null) rs.close(); } 
             catch(Exception e){e.printStackTrace();}  
        }        
        return result; 
    }
    
    @Override
    public Cliente queryByIdC(String id) {
       Cliente c= new Cliente();        
        int result =0;
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        try {
            Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
            String connectionUrl = "jdbc:sqlserver://inti.lab.inf.pucp.edu.pe:1433;"+
                                   "databaseName=inf282;user=inf282;password=inf282db;";
            conn = DriverManager.getConnection(connectionUrl);
            String SQLString = null;
            SQLString ="SELECT * FROM G04_CLIENTE WHERE IDCLIENTE = "+id+"";
            pstmt = conn.prepareStatement(SQLString);      
            rs =  pstmt.executeQuery();
            
            while (rs.next()){
                int idserv = rs.getInt("IDCLIENTE");
                String razon=rs.getString("RAZON_SOCIAL");
                String ruc=rs.getString("RUC");
                String dir=rs.getString("DIRECCION");
                String rep=rs.getString("REPRESENTANTE");
                Float lc=rs.getFloat("LINEA_CREDITO");
                String tipo=rs.getString("TIPO");
                
                
                c.setId(idserv);
                c.setDireccion(dir);
                c.setLineaCred(lc);
                c.setRUC(ruc);
                c.setRazonSocial(razon);
                c.setRepresentante(rep);
                c.setTipo(tipo);
                                      
                 if (c instanceof Nacional){  
                   
                SQLString =
                    "SELECT * FROM G04_NACIONAL WHERE IDCLIENTE = "+id+"";
                pstmt = conn.prepareStatement(SQLString);
                                                   
                result =  pstmt.executeUpdate();
                String dep=rs.getString("DEPARTAMENTO");
                String ciu=rs.getString("CIUDAD");
                ((Nacional)c).setCiudad(ciu);
                ((Nacional)c).setDepartamento(dep);
               
               
            } else if (c instanceof Internacional){
                
                 SQLString =
                    "SELECT * FROM G04_INTERNACIONAL WHERE IDCLIENTE = "+id+"";
                     pstmt = conn.prepareStatement(SQLString);
                           
                result =  pstmt.executeUpdate();
                 Float div=rs.getFloat("DIVISA");
                String pais=rs.getString("PAIS");
                 ((Internacional)c).setDivisa(div); 
                 ((Internacional)c).setPais(pais);
                             
            }
                          }
                           
        } catch (Exception ex) {
            ex.printStackTrace();
        } finally {
             //5. Se cierra la conexión
             try {if (rs != null) rs.close(); } 
             catch(Exception e){e.printStackTrace();}  
        } 
        return c;
    }

    
}
